"""
将装饰器定义为类的一部分

问题：
    你想在类中定义装饰器，并将其作用在其他函数或方法上。
解决方案：
    在类里面定义装饰器很简单，但是你首先要确认它的使用方式。

实际应用案例：
    1.标准库中，@property 装饰器实际上是一个类，
        它里面定义了三个方法 getter(), setter(), deleter() ,
        每一个方法都是一个装饰器。
"""

from functools import wraps


class User:
    def decorator1(self, func):
        """
        实例装饰器
        """

        @wraps(func)
        def wrapper(*arg, **kwargs):
            print("实例调用，装饰器")
            return func(*arg, **kwargs)

        return wrapper

    @classmethod
    def decorator2(self, func):
        """
        类装饰器
        """

        @wraps(func)
        def wrapper(*arg, **kwargs):
            print("类调用，装饰器")
            return func(*arg, **kwargs)

        return wrapper


user = User()


@user.decorator1
def say_hi(name):
    print("hi, ", name)


@user.decorator2
def say_hello(name):
    print("hello, ", name)


def use_say_hi():
    say_hi("Kevin")
    # 输出结果：
    """
    实例调用，装饰器
    hi,  Kevin
    """


def use_say_hello():
    say_hello("Kevin")
    # 输出结果：
    """
    类调用，装饰器
    hello,  Kevin
    """


if __name__ == '__main__':
    use_say_hi()
    use_say_hello()
